package com.kx.base.util;

import org.apache.tomcat.util.codec.binary.Base64;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * 文件、图片与Base64的转化
 *
 * @Author Sun
 * @Date 2021/7/21 17:37
 */
public class FileBase64Util {

    /**
     * 将图片转换成Base64
     */
    public static String image2Base64(BufferedImage image) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", stream);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        //将内存流里面的数据变成字节数组
        byte[] bytes = stream.toByteArray();
        //将字节数组变成base64
        return Base64.encodeBase64String(bytes);
    }

    /**
     * 文件转base64
     */
    public static String image2Base64(String fileName) {
        File file = new File(fileName);
        try {
            BufferedImage bufferedImage = ImageIO.read(file);
            return image2Base64(bufferedImage);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * base64转化为bufferedimage的方法
     */
    public static BufferedImage base642Image(String base64){
        //如果入参是空，就返回null
        if(base64==null||base64.length()==0){
            return null;
        }
        //进行解码，拿到字节数组
        byte[] bytes = Base64.decodeBase64(base64);
        //问题：
        //其实完全可以把bytes 直接写入到一个临时文件中
        //File
        //BufferedImage<=ImageIO.read(File)

        //把字节数组转化为图片
        //先要变成内存流
        ByteArrayInputStream stream=new ByteArrayInputStream(bytes);
        //流转图片
        try {
            return ImageIO.read(stream);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 把一个base64数据保存成文件
     */
    public static File base642File(String base64,String fileName){
        if(base64==null||base64.length()==0){
            return null;
        }
        byte [] bytes=Base64.decodeBase64(base64);
        File file=new File(fileName);
        if(!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(file);
            fos.write(bytes);
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fos!=null) {
                    fos.close();
                }else{
                    //可能文件不存在，可能文件没有写的权限
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }
}
